package com.xing.lei.happy.utils;

import oracle.jdbc.pool.OracleDataSource;

import javax.sql.DataSource;
import java.sql.Connection;
import java.sql.SQLException;
import java.util.Properties;

/**
 * 数据源工具类
 */
public class DataSourceUtil {

    /**
     * 创建Oracle数据源
     *
     * @param url      数据库连接URL
     * @param username 用户名
     * @param password 密码
     * @return DataSource对象
     * @throws SQLException SQL异常
     */
    public static DataSource createOracleDataSource(String url, String username, String password) throws SQLException {
        OracleDataSource dataSource = new OracleDataSource();
        dataSource.setURL(url);
        dataSource.setUser(username);
        dataSource.setPassword(password);
        return dataSource;
    }

    /**
     * 创建Oracle数据源（带额外属性）
     *
     * @param url        数据库连接URL
     * @param username   用户名
     * @param password   密码
     * @param properties 额外属性
     * @return DataSource对象
     * @throws SQLException SQL异常
     */
    public static DataSource createOracleDataSource(String url, String username, String password, Properties properties) throws SQLException {
        OracleDataSource dataSource = new OracleDataSource();
        dataSource.setURL(url);
        dataSource.setUser(username);
        dataSource.setPassword(password);

        // 设置额外属性
        if (properties != null) {
            for (String key : properties.stringPropertyNames()) {
                dataSource.getConnectionProperties().setProperty(key, properties.getProperty(key));
            }
        }

        return dataSource;
    }

    /**
     * 创建达梦数据库数据源
     *
     * @param url      数据库连接URL
     * @param username 用户名
     * @param password 密码
     * @return DataSource对象
     * @throws SQLException SQL异常
     */
    public static DataSource createDamengDataSource(String url, String username, String password) throws SQLException {
        try {
            // 加载达梦数据库驱动
            Class.forName("dm.jdbc.driver.DmDriver");
            
            // 使用通用的DataSource实现
            com.alibaba.druid.pool.DruidDataSource dataSource = new com.alibaba.druid.pool.DruidDataSource();
            dataSource.setUrl(url);
            dataSource.setUsername(username);
            dataSource.setPassword(password);
            return dataSource;
        } catch (ClassNotFoundException e) {
            throw new SQLException("未找到达梦数据库驱动，请确保已添加相关依赖", e);
        }
    }

    /**
     * 创建达梦数据库数据源（带额外属性）
     *
     * @param url        数据库连接URL
     * @param username   用户名
     * @param password   密码
     * @param properties 额外属性
     * @return DataSource对象
     * @throws SQLException SQL异常
     */
    public static DataSource createDamengDataSource(String url, String username, String password, Properties properties) throws SQLException {
        try {
            // 加载达梦数据库驱动
            Class.forName("dm.jdbc.driver.DmDriver");
            
            // 使用通用的DataSource实现
            com.alibaba.druid.pool.DruidDataSource dataSource = new com.alibaba.druid.pool.DruidDataSource();
            dataSource.setUrl(url);
            dataSource.setUsername(username);
            dataSource.setPassword(password);
            
            // 设置额外属性
            if (properties != null) {
                for (String key : properties.stringPropertyNames()) {
                    // 设置连接属性
                    dataSource.setConnectionProperties(key + "=" + properties.getProperty(key));
                }
            }
            
            return dataSource;
        } catch (ClassNotFoundException e) {
            throw new SQLException("未找到达梦数据库驱动，请确保已添加相关依赖", e);
        }
    }

    /**
     * 测试数据源连接
     *
     * @param dataSource 数据源
     * @return 连接是否成功
     */
    public static boolean testConnection(DataSource dataSource) {
        try (Connection connection = dataSource.getConnection()) {
            return connection.isValid(5); // 5秒超时
        } catch (SQLException e) {
            e.printStackTrace();
            return false;
        }
    }
}